package com.sh.business.service;

import cn.hutool.core.lang.tree.Tree;
import com.sh.business.domain.FinancingBo;
import com.sh.business.domain.bo.AleoAddressBo;
import com.sh.business.domain.bo.AssetConvertBo;
import com.sh.business.domain.bo.SetComputilityBo;
import com.sh.business.domain.form.ModifyPasswordBo;
import com.sh.business.domain.form.PasswordBo;
import com.sh.business.domain.form.TransferBo;
import com.sh.business.domain.form.UserLoginBo;
import com.sh.business.domain.vo.*;
import com.sh.business.domain.bo.UserBo;
import com.sh.common.mybatis.core.page.TableDataInfo;
import com.sh.common.mybatis.core.page.PageQuery;

import java.util.Collection;
import java.util.List;

/**
 * 用户信息Service接口
 *
 * @author ruoyi
 * @date 2024-10-09
 */
public interface IUserService {

    /**
     * 回收算力
     * @param orderSn
     */
    void recycleComputility(String orderSn);

    /**
     * 处理理财收益 - 错误数据处理
     */
    void handleUserFinancingError();

    /**
     * 手动确认到账
     * @param txHash
     */
    void handleConfirmReceipt(String txHash);

    /**
     * 处理理财收益
     */
    void handleUserFinancing();

    /**
     * 理财转出
     */
    boolean extract();

    /**
     * 转入理财
     * @param bo
     * @return
     */
    boolean financing(FinancingBo bo);

    /**
     * 修改推荐人
     * @param userId
     * @param parentId
     */
    void modifyParent(Long userId, Long parentId);

    /**
     * 资产兑换
     * @param bo
     * @return
     */
    boolean convertAsset(AssetConvertBo bo);

    /**
     * szpn转账
     * @param bo
     * @return
     */
    boolean transfer(TransferBo bo);


    /**
     * 修改密码
     * @param bo
     * @return
     */
    boolean modifyPassword(ModifyPasswordBo bo);

    /**
     * 设置密码
     * @param bo
     * @return
     */
    boolean setPassword(PasswordBo bo);

    /**
     * 按地区统计人数
     * @return
     */
    List<BackendUserVo> queryUserVoList();

    /**
     * 后台统计查询
     * @return
     */
    BackendDataVo queryDataVo();

    /**
     * 分页查询用户信息列表
     *
     * @param pageQuery 分页参数
     * @return 用户信息分页列表
     */
    TableDataInfo<DirectPushUserVo> queryDirectPushPageList(PageQuery pageQuery);

    /**
     * 查询团队统计
     * @return
     */
    MyTeamVo queryMyTeam();

    /**
     * 查询团队统计 - 直推
     * @return
     */
    MyTeamVo queryMyDirectTeam();

    /**
     * 查询每日新增
     * @return
     */
    MyTeamVo queryTodayMyTeam();

    /**
     * 查询算力
     * @return
     */
    UserComputilityDataVo queryComputility();

    /**
     * 保存签名
     * @param url
     * @return
     */
    Integer saveSignature(String url);

    /**
     * 登录
     *
     */
    String login(UserLoginBo bo);

    /**
     * 完善aleo地址
     *
     */
    boolean completeAddress(AleoAddressBo bo);

    /**
     * 划拨算力
     *
     */
    boolean setComputility(SetComputilityBo bo);

    /**
     * 用户信息
     * @param userId
     * @return
     */
    UserDataVo getUserInfo(Long userId);

    /**
     * 查询用户信息
     *
     * @param userId 主键
     * @return 用户信息
     */
    UserVo queryById(Long userId);

    /**
     * 分页查询用户信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 用户信息分页列表
     */
    TableDataInfo<UserVo> queryPageList(UserBo bo, PageQuery pageQuery);

    /**
     * 分页查询用户信息列表 - 查询节点列表
     *
     * @param pageQuery 分页参数
     * @return 用户信息分页列表
     */
    TableDataInfo<UserNodeVo> queryNodePageList(PageQuery pageQuery);

    /**
     * 查询符合条件的用户信息列表
     *
     * @param bo 查询条件
     * @return 用户信息列表
     */
    List<UserVo> queryList(UserBo bo);

    /**
     * 新增用户信息
     *
     * @param bo 用户信息
     * @return 是否新增成功
     */
    Boolean insertByBo(UserBo bo);

    /**
     * 修改用户信息
     *
     * @param bo 用户信息
     * @return 是否修改成功
     */
    Boolean updateByBo(UserBo bo);

    /**
     * 校验并批量删除用户信息信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 查询网体
     * @param userId
     * @return
     */
    List<Tree<Long>> queryNetBody(String userId);
}
